<?php
/*
 * @开发工具: JetBrains PhpStorm.
 * @文件名：TaskBase.class.php
 * @类功能: 任务管理
 * @开发者: zc
 * @开发时间： 15-10-22
 * @版本：version 1.0
 */
class TaskBase{
    //常理配置
    public static $process_name = "zc_process_server";                  //进程名称
    public static $pid_file = PATH."Parameter".DS."pid";               //pid文件位置
    public static $pid;                                                    //进程的pid

    /**
     * @功能：启动Task进程
     * @开发者：zc
     */
    public static function start(){
        //取得任务配置信息
        $config = @require_once(ROOT_PATH."/app/Common/Extend/Timing/Config/config.class.php");

        //判断进程ID文件是否存在
        if (file_exists(self::$pid_file)) {
            //写日志文件
            Log::write("进程文件已经存在！");

            //进程ID文件不存在
            return false;
        }

        //守护进程运行模式
        \swoole_process::daemon();

        //设置进程名称
        \swoole_set_process_name(self::$process_name);

        //注册任务信号
        self::register_signal();

        //循环生产任务
        foreach($config as $key=>$item) {
            //创建进程
            (new Process())->create_process($key,$item);
        }

        //写进程ID
        self::write_pid();

        //写日志文件
        Log::write("启动成功！");
        return false;
    }

    /**
     * @功能：停止Task进程
     * @开发者：zc
     */
    public static function stop(){
        //判断进程ID文件是否存在
        if (!file_exists(self::$pid_file)) {
            //写日志文件
            Log::write("进程文件取得失败！");

            //进程ID文件不存在
            return false;
        }

        //取得进程ID
        $pid = @file_get_contents(self::$pid_file);

        //判断进程ID是否存在
        if(!empty($pid)) {
            //检查进程是否存在
            if (\swoole_process::kill($pid, SIG_DFL)) {
                //删除进程
                \swoole_process::kill($pid, SIGTERM);
                @unlink(self::$pid_file);

                //写日志文件
                Log::write("进程" . $pid . "已结束！");
                return false;
            } else {
                //删除进程
                @unlink(self::$pid_file);

                //写日志文件
                Log::write("进程" . $pid . "不存在！");
                return false;
            }
        } else {
            //删除进程
            @unlink(self::$pid_file);

            //写日志文件
            Log::write("需要停止的进程未启动！");
            return false;
        }
    }

    /**
     * @功能：写入当前进程的pid到pid文件
     * @开发者：zc
     */
    private static function write_pid(){
        //取得进程ID
        if (!function_exists("posix_getpid")) {
            //删除进程ID文件
            Log::write("函数posix_getpid不存在，删除进程ID文件！");
            return false;
        }

        //取得进程ID
        self::$pid = posix_getpid();

        //写文件
        file_put_contents(self::$pid_file, self::$pid);
        return true;
    }

    /**
     * @功能：注册进程信号
     * @return bool 放回状态
     * @开发者：zc
     */
    private static function register_signal(){
        //判断是否需要退出
        \swoole_process::signal(SIGTERM, function ($sig_no) {
            //退出主进程
            @unlink(self::$pid_file);

            //写日志文件
            Log::write("收到退出信号,退出主进程！".print_r($sig_no,true));
            exit;
        });
    }
}